class Solution {
public:
    int digitAtIndex(int n) {
        //记录n指向的应该为几位数
        int l = 1;
        
        //记录l位的起始位置
        long long  start = 1;
        
        //记录l位数可以占多少位
        long long max = 9;        

        //若该数大于l位最大数字，继续循环，减去最大数字
        while(n > max) {
            n -= max;
            start *= 10;
            l ++; 
            max = l * start * 9;        //记录l位数可以占多少位
        }

        int s = start + (n - 1) / l; //确定该数为len位数的第几个数,并加上len位的第一个数
        //cout << s << endl;

        int w = (n - 1) % l; //确定所求为该数的第几位(由于位数相反)
        //cout << w << endl;

        
        return to_string(s)[w] - '0';
    }
};